package io.gitee.luoyuan800;

import ch.qos.logback.classic.Level;
import io.gitee.luoyuan800.tool.llm.agent.AiAgent;
import io.gitee.luoyuan800.tool.llm.agent.QwenAgent;
import io.gitee.luoyuan800.tool.llm.bean.config.AiAgentConfig;
import io.gitee.luoyuan800.tool.llm.bean.config.ModelConfig;
import io.gitee.luoyuan800.tool.llm.web.JavaHttpClient;
import io.gitee.luoyuan800.tool.llm.web.RestfulClient;
import org.slf4j.LoggerFactory;

import java.util.Map;

public class ThinkingAgentService {
    private final AiAgent thinkingAgent;
    private final AiAgent mainAgent;
    private final AiAgent reviewAgent;

    public ThinkingAgentService(String token) {
        RestfulClient restfulClient = new JavaHttpClient();
        AiAgentConfig thinkingAiAgentConfig = buildAgentConfig(token, "qwen-turbo-latest", """
# 角色
你是一位AI辅助外挂，拥有卓越的模拟人类深度思考能力。你能够精准、全面地剖析用户输入的问题，并将其巧妙分解为多个关键部分，为引导大语言模型生成高质量、合理的回答提供有力支持。你的核心任务是精确拆解问题，提供清晰的解题思路与明确指令，助力大语言模型得出最终答案。输出的对象为大语言模型，而非直接对话。

## 技能
### 技能 1: 深度拆解问题
1. **快速识别核心要点**：运用系统、科学且全面的分析方法，迅速、精准找出问题的核心要点与关键信息。
2. **多层拆解**：将问题深入拆解为多个逻辑层次分明的子问题或步骤，清晰呈现问题的内在结构，帮助用户更好地理解问题本质。
3. **扩散思维**：在思考过程中给出合理建议，扩展问题的讨论范围。
4. **背景知识提供**：针对复杂问题，提供必要的背景知识或相关概念解释，以便更有效地拆解问题。

### 技能 2: 精准引导回答生成
1. **高度针对性引导**：依据问题拆解的详细结果，为大语言模型提供高度针对性、细致且明确的引导与提示。引导内容涵盖问题的重点方向、关键要素以及预期的回答风格等。
2. **多维度思考**：从多个维度深入思考问题，提供丰富、可行且具创意的思路与方向。这些思路和方向需结合具体问题场景，助力大语言模型生成更全面、精准、高质量的回答。
3. **逻辑框架构建**：结合常见且有效的思考模式与严谨的逻辑框架，引导大语言模型构建合理、完善且独特的回答结构。例如，引导过程中可提及采用总分总、因果关系、对比分析等逻辑结构。

## 限制
- **紧扣主题**：所有回答紧密围绕用户输入的问题展开，杜绝出现无关内容。
- **逻辑清晰**：输出的问题拆解和引导内容逻辑清晰、层次分明、表达准确。
- **简洁明了**：无需给出礼貌性回答语句，直接输出内容。
- **明确指导**：避免给出模糊、宽泛的引导，确保引导内容具有明确、实际且可操作的指导价值，让大语言模型清楚知道需做什么以及如何去做。

## 输出
输出内容应清晰明了、重点突出，具备明确指导性，方便大语言模型依据引导生成回答。输出采用简洁格式，便于大语言模型理解和遵循。
               """);
        thinkingAgent = new QwenAgent(thinkingAiAgentConfig, restfulClient, "我只负责思考");
        AiAgentConfig actionAiAgentConfig = buildAgentConfig(token, "qwen-coder-plus-latest", null);
        mainAgent = new QwenAgent(actionAiAgentConfig, restfulClient, "我负责干活");
        AiAgentConfig reviewAiAgentConfig = buildAgentConfig(token, "qwen-coder-plus-latest", """
# 角色
你是一个严谨且灵活的审核助手，具备敏锐的细节观察力和出色的逻辑分析能力。你的主要职责是依据给定的“要求”，全方位、细致地比对“输出”内容，精准判断其是否满足要求。

## 技能
### 技能 1: 接收信息
准确接收“要求”和“输出”内容，确保信息完整无遗漏。

### 技能 2: 详细比对
将“输出”与“提示要求”进行逐点、深入的详细比对，从各个维度检查是否完全符合要求，包括但不限于内容准确性、格式规范性等。
如果输出符合规范，直接给出“输出”，无需其他额外的内容。

### 技能 3: 修改完善
若“输出”不符合要求，依据合理的逻辑规则，对输出进行针对性修改。修改过程中要充分考虑各种可能情况，确保修改后的内容全面符合要求。修改完成后，需再次检查确认是否符合要求。
                """);
        reviewAgent = new QwenAgent(reviewAiAgentConfig, restfulClient, "我负责审核");
        ((ch.qos.logback.classic.Logger) LoggerFactory.getILoggerFactory().getLogger("io.gitee.luoyuan800.tool.llm.agent.QwenAgent")).setLevel(Level.INFO);
    }


    public Map<String, String> call(String string) {
        String thinking = thinkingAgent.chat(string);
        String result = mainAgent.chat(thinking);
        String finalResult = reviewAgent.chat("要求：\n\n" + result + "\n\n输出：\n\n" + result);
        return Map.of("thinking", thinking, "result", finalResult);
    }

    private AiAgentConfig buildAgentConfig(String token, String model, String system) {
        AiAgentConfig thinkingAiAgentConfig = new AiAgentConfig();
        ModelConfig modelConfig = new ModelConfig();
        modelConfig.setToken(token);
        modelConfig.setModel(model);
        thinkingAiAgentConfig.setModelConfig(modelConfig);
        thinkingAiAgentConfig.setWebSearch(false);
        thinkingAiAgentConfig.setEnableThink(false);
        thinkingAiAgentConfig.setStream(true);
        thinkingAiAgentConfig.setSystem(system);
        return thinkingAiAgentConfig;
    }

}
